// WebSocket 实例

import {nextTick} from "vue";


let socket = null;

// 重连定时器
let reconnectTimer = null;
// 心跳检测定时器
/*let heartbeatTimer = null;*/



// WebSocket 连接状态
const WebSocketStatus = {
    CONNECTING: 0,
    OPEN: 1,
    CLOSING: 2,
    CLOSED: 3,
};

/**
 * 初始化 WebSocket 连接
 * @param {String} phoneNumber 用户手机号
 * @param {Function} onMessageCallback 接收消息的回调函数
 */
export function initWebSocket(phoneNumber, onMessageCallback, chatMessagesContainer, handleGetContactList) {
    /*const userInfo = localStorage.getItem('userInfo');
    const phoneNumber = userInfo.value.phoneNumber;*/
 /*   const store = useStore();
    const phoneNumber = store.state.userInfo.phoneNumber;*/

    // WebSocket 服务地址
    const WEBSOCKET_URL = `ws://172.20.10.9:8080/chat?phoneNumber=${phoneNumber}`;
   /* const WEBSOCKET_URL = `ws:https://9841-101-71-227-41.ngrok-free.app/chat?phoneNumber=${phoneNumber}`;*/
    console.log("111", WEBSOCKET_URL)
    // 防止重复初始化
    if (socket && socket.readyState === WebSocketStatus.OPEN) {
        console.log("WebSocket 已连接，无需重新初始化");
        return;
    }
    // 保存用户手机号
    /*userPhone = phoneNumber;*/

    // 创建 WebSocket 实例
    socket = new WebSocket(WEBSOCKET_URL);

    // WebSocket 连接成功
    socket.onopen = () => {
        console.log(`[WebSocket] ${phoneNumber} 连接已建立`);
        /*startHeartbeat(); // 开始心跳检测*/
    };

    // 接收服务器消息
    socket.onmessage = (event) => {
        console.log(`[WebSocket] 收到消息: ${event.data}`);

        // 将收到的消息转换为 JSON 对象
        const messageData = JSON.parse(event.data);

        // 处理收到的消息
        /*if (onMessageCallback && onMessageCallback.messageType !== 'refreshContacts') {
            onMessageCallback(messageData);
        }*/
        if (messageData.messageType !== 'updateSign' && messageData.messageType !== 'refreshContacts') {
            if (onMessageCallback) {
                onMessageCallback(messageData);
            }
        }else if(messageData.messageType === 'refreshContacts'){
            if (handleGetContactList) {
                handleGetContactList();
            }
        }
        // 确保滚动到底部
        /*nextTick().then(() => {
            setTimeout(() => {
                // 延迟执行的代码
                console.log("休眠结束，执行操作");
            }, 500);
            if (chatMessagesContainer && chatMessagesContainer.value) {
                chatMessagesContainer.value.scrollTop = chatMessagesContainer.value.scrollHeight;
            } else {
                console.warn("chatMessagesContainer 未定义或未绑定到 DOM 元素");
            }
        });*/

    };

    // WebSocket 连接关闭
    socket.onclose = () => {
        console.log(`[WebSocket] ${phoneNumber} 连接已关闭`);
        /*stopHeartbeat(); // 停止心跳检测*/
        reconnect(phoneNumber,onMessageCallback); // 尝试重新连接
    };

    // WebSocket 连接出错
    socket.onerror = (error) => {
        console.error("[WebSocket] 连接出错:", error);
        socket.close(); // 关闭连接
    };
}

/**
 * 发送消息给服务器
 * @param {Object} message 需要发送的消息对象
 */
export function sendMessage(message) {
    if (socket && socket.readyState === WebSocketStatus.OPEN) {
        // 将消息对象转换为 JSON 字符串并发送
        socket.send(JSON.stringify(message));
        console.log("[WebSocket] 发送消息:", message);
    } else {
        console.warn("[WebSocket] 连接未建立，无法发送消息");
    }
}

/**
 * 发送系统消息，用于更新联系人状态
 */
export function sendSystemMessage() {
    const systemMessage = {
        updateSign: true,
        isSystem: true,
    };
    sendMessage(systemMessage);
}

/**
 * 关闭 WebSocket 连接
 */
export function closeWebSocket() {
    if (socket) {
        socket.close(); // 主动关闭连接
        socket = null;
        /*stopHeartbeat(); // 停止心跳检测*/
        console.log("[WebSocket] 连接已销毁");
    }
}

/**
 * 尝试重新连接
 * @param {String} phoneNumber 用户手机号
 * @param {Function} onMessageCallback 接收消息的回调函数
 */
function reconnect(phoneNumber,onMessageCallback) {
    if (reconnectTimer) return;
    console.log("[WebSocket] 尝试重新连接...");
    // 设置重连定时器
    reconnectTimer = setTimeout(() => {
        initWebSocket(phoneNumber,onMessageCallback); // 重新初始化 WebSocket 连接
        reconnectTimer = null; // 重置重连定时器
    }, 50000); // 每 5 秒尝试重连一次
}

/**
 * 心跳检测
 */
/*function startHeartbeat() {
    // 每 30 秒发送一次心跳消息
    heartbeatTimer = setInterval(() => {
        if (socket && socket.readyState === WebSocketStatus.OPEN) {
            const pingMessage = {
                type: "ping",
            };
            socket.send(JSON.stringify(pingMessage));
            console.log("[WebSocket] 发送心跳检测消息: ping");
        }
    }, 30000);
}*/

/**
 * 停止心跳检测
 */
/*function stopHeartbeat() {
    clearInterval(heartbeatTimer);
    heartbeatTimer = null;
}*/
